package annotation_;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.*;

/**
 * @author 15594
 *
 * 自定义注解
 * 1、注解声明：@interface
 * 2、内部定义成员，通常用value表示
 * 3、可以指定成员的默认值，使用default定义
 * 4、如果自定义注解没有成员，表示这个注解是一个标识作用
 *
 * 自定义注解必须配上注解的信息处理流程（使用反射）才有意义。
 *
 * 元注解——jdk提供的，用来修饰其他注解的
 *
 * 1、@Retention：指定所修饰的注解的生命周期，
 * SOURCE（注解只保留在源文件，当Java文件编译成class文件的时候，注解被遗弃；被编译器忽略）、
 * CLASS（注解被保留到class文件，但jvm加载class文件时候被遗弃，这是默认的生命周期）、
 * RUNTIME（注解将被编译器记录在类文件中，并在运行时由 VM 保留，因此它们可以被反射读取）
 *
 * 2、@Target：声明注解能标注到哪里（类上、方法上、变量上、构造器上...）
 * CONSTRUCTOR:表述构造器
 * FIELD：用于表述域
 * LOCAL_VARIABLE：描述局部变量
 * TYPE：描述类、接口、enum
 * METHOD:描述方法
 * PACKAGE：描述包
 * PARAMETER：描述参数
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({CONSTRUCTOR,FIELD,LOCAL_VARIABLE,METHOD,PACKAGE,PARAMETER,TYPE})
public @interface MyAnnotation {
    String value() default "hi";
}
